// nfcModule.js - 修复后的 NFC 模块
// 包路径
const package_NdefRecord = 'android.nfc.NdefRecord';
const package_NdefMessage = 'android.nfc.NdefMessage';
const package_TECH_DISCOVERED = 'android.nfc.action.TECH_DISCOVERED';
const package_Intent = 'android.content.Intent';
const package_Activity = 'android.app.Activity';
const package_PendingIntent = 'android.app.PendingIntent';
const package_IntentFilter = 'android.content.IntentFilter';
const package_NfcAdapter = 'android.nfc.NfcAdapter';
const package_Ndef = 'android.nfc.tech.Ndef';
const package_NdefFormatable = 'android.nfc.tech.NdefFormatable';
const package_Parcelable = 'android.os.Parcelable';
const package_String = 'java.lang.String';

// 导入 Android 类
let Intent, Activity, PendingIntent, IntentFilter, NfcAdapter, Ndef, NdefFormatable, Parcelable, StringClass;
let NdefRecord, NdefMessage;

// 尝试导入 Android 类
// plus.android.importClass()动态导入Android原生类，以便在JavaScript中调用Android API。
try {
  if (typeof plus !== 'undefined' && plus.android) {
    Intent = plus.android.importClass('android.content.Intent');
    Activity = plus.android.importClass('android.app.Activity');
    PendingIntent = plus.android.importClass('android.app.PendingIntent');
    IntentFilter = plus.android.importClass('android.content.IntentFilter');
    NfcAdapter = plus.android.importClass('android.nfc.NfcAdapter');
    Ndef = plus.android.importClass('android.nfc.tech.Ndef');
    NdefFormatable = plus.android.importClass('android.nfc.tech.NdefFormatable');
    Parcelable = plus.android.importClass('android.os.Parcelable');
    StringClass = plus.android.importClass('java.lang.String');
    
    // 动态导入 NdefRecord 和 NdefMessage
    NdefRecord = plus.android.importClass("android.nfc.NdefRecord");
    NdefMessage = plus.android.importClass("android.nfc.NdefMessage");
  }
} catch (e) {
  console.error("导入Android类失败:", e);
}

// 控制是否准备读取NFC标签
let readyRead = true;
// 标记设备是否不支持NFC
let noNFC = false;
// 标记是否正在监听NFC事件
let isListening = false;
// 用于防抖处理，避免重复读取同一张卡
let lastReadId = null;
let lastReadTime = 0;
// 防抖延迟时间（1秒）
const DEBOUNCE_DELAY = 1000;

// 定义支持的NFC技术列表，用于注册NFC前台分发
let techListsArray = [
    ['android.nfc.tech.IsoDep'],
    ['android.nfc.tech.NfcA'],
    ['android.nfc.tech.NfcB'],
    ['android.nfc.tech.NfcF'],
    ['android.nfc.tech.Nfcf'],
    ['android.nfc.tech.NfcV'],
    ['android.nfc.tech.NdefFormatable'],
    ['android.nfc.tech.MifareClassi'],
    ['android.nfc.tech.MifareUltralight']
];

export default {
    // 初始化NFC监听
    initNFCListener() {
        console.log("初始化NFC监听");
        let that = this;
        
        // 检查是否已导入必要的类
        if (!Intent || !NfcAdapter) {
            console.error("必要的Android类未导入");
            uni.$emit('nfcError', 'NFC功能初始化失败');
            return false;
        }
        
        try {
			// 获取主Activity实例
            let main = plus.android.runtimeMainActivity();
			// 获取NFC适配器
            let nfcAdapter = NfcAdapter.getDefaultAdapter(main);
            
            if (nfcAdapter == null) {
                uni.$emit('nfcError', '设备不支持NFC！');
                // noNFC = true;
                // return false;
            }
            
            if (!nfcAdapter.isEnabled()) {
                uni.$emit('nfcError', '请在系统设置中先启用NFC功能！');
                // noNFC = true;
                // return false;
            } else {
                noNFC = false;
            }

            let intent = new Intent(main, main.getClass());
			// 设置Intent标志，确保Activity在栈顶时不会重新创建
            intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            let pendingIntent = PendingIntent.getActivity(main, 0, intent, 0);
            let ndef = new IntentFilter("android.nfc.action.TECH_DISCOVERED");
            ndef.addDataType("*/*");
            let intentFiltersArray = [ndef];

            // 移除之前可能存在的监听器
            plus.globalEvent.removeEventListener('newintent', that.globalEventListener);
            
            // 定义全局事件监听函数
            that.globalEventListener = function() {
                console.log("检测到NFC intent");
                setTimeout(() => {
                    that.processNFCIntent();
                }, 100);
            };
            
            // 添加事件监听
            plus.globalEvent.addEventListener('newintent', that.globalEventListener);
            
            // 启用前台分发
            nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);
            isListening = true;
            
            uni.$emit('nfcStatus', {status: 'listening', message: 'NFC监听已启动'});
            return true;
            
        } catch (e) {
            console.error("初始化NFC监听错误:", e);
            uni.$emit('nfcError', 'NFC初始化失败: ' + e.message);
            return false;
        }
    },
    
    // 处理NFC Intent
    processNFCIntent() {
        console.log("处理NFC Intent");
        let main = plus.android.runtimeMainActivity();
		//  获取当前Activity的Intent
        let intent = main.getIntent();
        let that = this;
        
        if (!intent) {
            console.log("Intent为空");
            return;
        }
        
        let action = intent.getAction();
        console.log("Intent Action:", action);
        // 检查是否为NFC技术发现Intent
        if (package_TECH_DISCOVERED === action) {
            if (readyRead) {
				// 调用read方法读取NFC标签ID
                const id = that.read(intent);
                
                // 防抖处理
                const now = Date.now();
                if (id && id === lastReadId && (now - lastReadTime) < DEBOUNCE_DELAY) {
                    console.log("防抖: 忽略短时间内重复读取的同一张卡");
                    uni.$emit('nfcDebounce', {id, message: '请勿短时间内重复刷卡'});
                    return;
                }
                
                lastReadId = id;
                lastReadTime = now;
                
                if (id) {
                    // 触发NFC读取成功事件
                    uni.$emit('nfcIdRead', id);
                    
                    // 尝试重置Intent，准备下一次读取
                    try {
                        // 确保Intent类已导入
                        if (typeof Intent !== 'undefined') {
                            main.setIntent(new Intent());
                            console.log("Intent重置成功");
                        } else {
                            console.error("Intent类未定义，无法重置");
                        }
                    } catch (e) {
                        console.warn("重置Intent失败:", e);
                    }
                } else {
                    uni.$emit('nfcError', '读取NFC标签失败');
                }
            }
        } else {
            console.log("非NFC相关的Intent Action:", action);
        }
    },
    
    // 读取NFC标签
    // read(intent) {
    //     console.log("读取NFC标签");
    //     let that = this;
        
    //     try {
    //         // NFC id 从Intent中获取NFC标签ID的字节数组
    //         let bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
    //         if (!bytesId) {
    //             console.log("未获取到NFC ID");
    //             return null;
    //         }
            
    //         let nfc_id = that.byteArrayToHexString(bytesId);
    //         console.log("读取到NFC ID:", nfc_id);
            
    //         return nfc_id;
    //     } catch (e) {
    //         console.error("读取NFC标签错误:", e);
    //         return null;
    //     }
    // },
    
	// 可以扩展read方法以支持更多标签数据类型
	read(intent) {
	  try {
	    // 读取标签ID
	    let bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
	    let nfc_id = this.byteArrayToHexString(bytesId);
	    
	    // 尝试读取NDEF消息（如果存在）
	    // let rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
	    // if (rawMessages) {
	    //   // 处理NDEF消息
	    //   let ndefMessages = [];
	    //   for (let i = 0; i < rawMessages.length; i++) {
	    //     let ndefMessage = plus.android.invoke(rawMessages[i], "getRecords");
	    //     // 进一步处理NDEF记录
	    //   }
	    //   return { id: nfc_id, messages: ndefMessages };
	    // }
	    
	    return nfc_id;
	  } catch (e) {
	    console.error("读取NFC标签错误:", e);
	    return null;
	  }
	},
	
    // 字节数组转十六进制字符串
    byteArrayToHexString: function(inarray) {
        let i, j, inn;
        let hex = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"];
        let out = "";

        for (j = 0; j < inarray.length; ++j) {
            inn = inarray[j] & 0xff;
            i = (inn >>> 4) & 0x0f;
            out += hex[i];
            i = inn & 0x0f;
            out += hex[i];
        }
		
        return out;
    },
	/**
	 * 将字节数组转换为十进制字符串（大数安全）
	 * @param {number[]} byteArray - 字节数组，如 [0xA1, 0xB2, 0xC3]
	 * @returns {string} 十进制字符串
	 */
	byteArrayToHexString: function(byteArray) {
	    let result = 0n; // 使用 BigInt 精确表示大整数
	    for (let i = 0; i < byteArray.length; i++) {
	        result = (result << 8n) + BigInt(byteArray[i] & 0xff);
	    }
	    return result.toString(); // 转为十进制字符串
	},
    
    // 停止NFC监听
    // stopNFCListening() {
    //     console.log("停止NFC监听");
    //     let main = plus.android.runtimeMainActivity();
        
    //     try {
    //         let nfcAdapter = NfcAdapter.getDefaultAdapter(main);
            
    //         if (nfcAdapter && !noNFC) {
    //             nfcAdapter.disableForegroundDispatch(main);
    //         }
            
    //         // 移除事件监听
    //         plus.globalEvent.removeEventListener('newintent', this.globalEventListener);
            
    //         isListening = false;
    //         uni.$emit('nfcStatus', {status: 'stopped', message: 'NFC监听已停止'});
            
    //     } catch (e) {
    //         console.error("停止NFC监听错误:", e);
    //     }
    // },
    
    // 检查NFC状态
    checkNFCStatus() {
        let main = plus.android.runtimeMainActivity();
        let nfcAdapter = NfcAdapter.getDefaultAdapter(main);
        
        if (nfcAdapter == null) {
            return {supported: false, enabled: false, listening: isListening};
        }
        
        return {
            supported: true, 
            enabled: nfcAdapter.isEnabled(),
            listening: isListening
        };
    },
    
    // 手动重新初始化Android类（如果需要）
    reinitAndroidClasses() {
        try {
            if (typeof plus !== 'undefined' && plus.android) {
                Intent = plus.android.importClass('android.content.Intent');
                Activity = plus.android.importClass('android.app.Activity');
                PendingIntent = plus.android.importClass('android.app.PendingIntent');
                IntentFilter = plus.android.importClass('android.content.IntentFilter');
                NfcAdapter = plus.android.importClass('android.nfc.NfcAdapter');
                Ndef = plus.android.importClass('android.nfc.tech.Ndef');
                NdefFormatable = plus.android.importClass('android.nfc.tech.NdefFormatable');
                Parcelable = plus.android.importClass('android.os.Parcelable');
                StringClass = plus.android.importClass('java.lang.String');
                
                console.log("Android类重新初始化成功");
                return true;
            }
        } catch (e) {
            console.error("重新初始化Android类失败:", e);
            return false;
        }
    }
};